package com.cr4y0n.hot100;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * @author cr4y0n
 * <a href="https://leetcode.cn/problems/group-anagrams/description/?envType=study-plan-v2&envId=top-100-liked">字母异位分词</a>
 * 给你一个字符串数组，请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
 * 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
 * 示例 1:
 * 输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
 * 输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
 * 示例 2:
 * 输入: strs = [""]
 * 输出: [[""]]
 * 示例 3:
 * 输入: strs = ["a"]
 * 输出: [["a"]]
 */
public class _49_GroupAnagrams {
    public static class Solution {
        public List<List<String>> groupAnagrams(String[] strs) {
            HashMap<String, List<String>> map = new HashMap<>();
            for (String str : strs) {
                int[] count = new int[26];
                for (int i = 0; i < str.length(); i++) {
                    count[str.charAt(i) - 'a']++;
                }
                StringBuffer sb = new StringBuffer();
                for (int i = 0; i < 26; i++) {
                    if (count[i] != 0) {
                        sb.append(i + 'a');
                        sb.append(count[i]);
                    }
                }
                List<String> list = map.getOrDefault(sb.toString(), new ArrayList<>());
                list.add(str);
                map.put(sb.toString(), list);
            }
            return new ArrayList<List<String>>(map.values());
        }
    }
}
